package refactortips.editors.codeSmells;

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.wb.swt.ResourceManager;
import org.eclipse.wb.swt.SWTResourceManager;

import refactortips.editors.AbstractRefactorTipsEditor;

public class LongParameterListEditor extends AbstractRefactorTipsEditor {

	protected final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
	
	public LongParameterListEditor() {
	}

	/**
	 * Create contents of the editor part.
	 * @param parent
	 */
	@Override
	public void createPartControl(Composite parent) {
		
		Form frmCodeSmell = formToolkit.createForm(parent);
		formToolkit.paintBordersFor(frmCodeSmell);
		frmCodeSmell.setText("Long Parameter List");
		frmCodeSmell.getBody().setLayout(new FillLayout(SWT.HORIZONTAL));
		
		TabFolder tabFolder = new TabFolder(frmCodeSmell.getBody(), SWT.NONE);
		formToolkit.adapt(tabFolder);
		formToolkit.paintBordersFor(tabFolder);
		
		ScrolledComposite sc = new ScrolledComposite(tabFolder, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
		sc.setExpandHorizontal(true);
	    sc.setExpandVertical(true);
		
		TabItem tbtmDescription = new TabItem(tabFolder, SWT.NONE);
		tbtmDescription.setText("Descri\u00E7\u00E3o");
		
		ScrolledComposite scrolledComposite = new ScrolledComposite(tabFolder, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
		tbtmDescription.setControl(scrolledComposite);
		formToolkit.paintBordersFor(scrolledComposite);
		scrolledComposite.setExpandHorizontal(true);
		scrolledComposite.setExpandVertical(true);
		
		Composite composite_3 = new Composite(scrolledComposite, SWT.NONE);
		formToolkit.adapt(composite_3);
		formToolkit.paintBordersFor(composite_3);
		composite_3.setLayout(null);
		
		Label lblDescription = new Label(composite_3, SWT.NONE);
		lblDescription.setBounds(10, 10, 102, 25);
		lblDescription.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
		lblDescription.setFont(SWTResourceManager.getFont("Segoe UI", 14, SWT.BOLD));
		formToolkit.adapt(lblDescription, true, true);
		lblDescription.setText("Descri\u00E7\u00E3o");
		
		Link linkReplaceParameterWithObject = new Link(composite_3, SWT.NONE);
		linkReplaceParameterWithObject.setBounds(115, 416, 222, 21);
		linkReplaceParameterWithObject.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		formToolkit.adapt(linkReplaceParameterWithObject, true, true);
		linkReplaceParameterWithObject.setText("<a>Replace Parameter with Method</a>");
		
		Link linkPreserveWholeObject = new Link(composite_3, 0);
		linkPreserveWholeObject.setText("<a>Preserve Whole Object</a>");
		linkPreserveWholeObject.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		linkPreserveWholeObject.setBounds(52, 459, 158, 21);
		formToolkit.adapt(linkPreserveWholeObject, true, true);
		
		Link linkIntroduceParameterObject = new Link(composite_3, 0);
		linkIntroduceParameterObject.setText("<a>Introduce Parameter Object</a>");
		linkIntroduceParameterObject.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		linkIntroduceParameterObject.setBounds(501, 479, 191, 21);
		formToolkit.adapt(linkIntroduceParameterObject, true, true);
		
		StyledText styledText = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText.setEnabled(false);
		styledText.setDoubleClickEnabled(false);
		styledText.setJustify(true);
		styledText.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText.setText("\t\tNos prim\u00F3rdios da programa\u00E7\u00E3o n\u00F3s fomos ensinados a passar como par\u00E2metro tudo o que a rotina necessitava. Isso era compreens\u00EDvel porque a alternativa era dados globais, e dados globais s\u00E3o malignos e normalmente trabalhosos. Objetos mudam essa situa\u00E7\u00E3o porque se voc\u00EA n\u00E3o tiver algo que precise, voc\u00EA sempre pode perguntar a outro objeto para obter para voc\u00EA. Sendo assim, com objetos voc\u00EA n\u00E3o passa tudo o que o m\u00E9todo precisa, ao inv\u00E9s disso voc\u00EA passa o suficiente para que o m\u00E9todo pode chegar a tudo que precisa. Muito do que o m\u00E9todo precisa est\u00E1 dispon\u00EDvel na classe em que ele se encontra. Em programas orientado a objeto listas de par\u00E2metros tendem a ser bem menores do que em programas tradicionais.");
		styledText.setBounds(314, 78, 538, 219);
		formToolkit.adapt(styledText);
		formToolkit.paintBordersFor(styledText);
		
		StyledText styledText_1 = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText_1.setText("\t\tIsso \u00E9 bom porque longas listas de par\u00E2metros s\u00E3o dif\u00EDceis de entender, porque elas se tornam inconsistentes e dif\u00EDceis de usar, e porque voc\u00EA est\u00E1 sempre mudando-as quando voc\u00EA precisa de mais dados. A maioria das mudan\u00E7as s\u00E3o removidas passando objetos porque \u00E9 mais prov\u00E1vel que voc\u00EA precise fazer apenas algumas chamadas para obter novos dados");
		styledText_1.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText_1.setEnabled(false);
		styledText_1.setJustify(true);
		styledText_1.setDoubleClickEnabled(false);
		styledText_1.setBounds(43, 314, 809, 98);
		formToolkit.adapt(styledText_1);
		formToolkit.paintBordersFor(styledText_1);
		
		StyledText styledText_2 = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText_2.setText("\t\tUse\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tquando voc\u00EA pode obter os dados em um par\u00E2metro fazendo uma chamada de um objeto que voc\u00EA j\u00E1 conhece. Esse objeto pode ser um campo ou pode ser outro par\u00E2metro. Use \t\t\t\t\t\t\t\t\t\t\tpara obter um grupo de dados colhidos de um objeto e substitua-o com o pr\u00F3prio objeto. Se voc\u00EA tem v\u00E1rios itens de dados com nenhum objeto l\u00F3gico use\t\t\t\t\t\t\t\t\t\t\t\t\t.");
		styledText_2.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText_2.setEnabled(false);
		styledText_2.setJustify(true);
		styledText_2.setDoubleClickEnabled(false);
		styledText_2.setBounds(43, 416, 809, 98);
		formToolkit.adapt(styledText_2);
		formToolkit.paintBordersFor(styledText_2);
		
		StyledText styledText_3 = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText_3.setText("\t\tExiste uma exce\u00E7\u00E3o importante para fazer essas altera\u00E7\u00F5es. \u00C9 quando voc\u00EA explicitamente n\u00E3o quiser criar uma depend\u00EAncia entre o objeto chamado e o objeto maior. Nestes cen\u00E1rios desagrupar os dados e envi\u00E1-los juntos como par\u00E2metros \u00E9 sensato, mas preste aten\u00E7\u00E3o para o esfor\u00E7o envolvido. Se a lista de par\u00E2metros \u00E9 muito longa e muda com frequ\u00EAncia, voc\u00EA precisa repensar a sua estrutura de depend\u00EAncia.");
		styledText_3.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText_3.setEnabled(false);
		styledText_3.setJustify(true);
		styledText_3.setDoubleClickEnabled(false);
		styledText_3.setBounds(43, 520, 809, 112);
		formToolkit.adapt(styledText_3);
		formToolkit.paintBordersFor(styledText_3);
		
		Label lblNewLabel = new Label(composite_3, SWT.NONE);
		lblNewLabel.setImage(ResourceManager.getPluginImage("RefactorTips", "images/codeSmells/longParameterList.jpg"));
		lblNewLabel.setBounds(43, 103, 250, 166);
		formToolkit.adapt(lblNewLabel, true, true);
		scrolledComposite.setContent(composite_3);
		scrolledComposite.setMinSize(composite_3.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		
		TabItem tbtmUsage = new TabItem(tabFolder, SWT.NONE);
		tbtmUsage.setText("Exemplo");
		
		ScrolledComposite scrolledComposite_1 = new ScrolledComposite(tabFolder, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
		tbtmUsage.setControl(scrolledComposite_1);
		formToolkit.paintBordersFor(scrolledComposite_1);
		scrolledComposite_1.setExpandHorizontal(true);
		scrolledComposite_1.setExpandVertical(true);
		
		Composite composite = new Composite(scrolledComposite_1, SWT.NONE);
		formToolkit.adapt(composite);
		formToolkit.paintBordersFor(composite);
		scrolledComposite_1.setContent(composite);
		scrolledComposite_1.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		
		TabItem tbtmVideo = new TabItem(tabFolder, SWT.NONE);
		tbtmVideo.setText("Video");
		
		Browser browser = new Browser(tabFolder, SWT.NONE);
		browser.setUrl("");
		tbtmVideo.setControl(browser);
		formToolkit.paintBordersFor(browser);
	}
}
